From 934e3a569516ae07dc5d04c64f512cad7ba8d9e8 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Mon, 12 May 2008 10:06:40 +0100 Subject: [PATCH] x86 hvm: Clean MSI related data when destroy domain. Signed-off-by: Shan Haitao --- xen/arch/x86/msi.c | 10 +++++++++- xen/drivers/passthrough/vtd/iommu.c | 1 + xen/include/asm-x86/msi.h | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c index 3bc4abd283..bee19a2963 100644 --- a/xen/arch/x86/msi.c +++ b/xen/arch/x86/msi.c @@ -780,8 +780,16 @@ void pci_disable_msi(int vector) __pci_disable_msix(vector); } -void pci_cleanup_msi(struct pci_dev *dev) +void pci_cleanup_msi(u8 bus, u8 devfn) { + struct pci_dev *dev = get_msi_pdev(bus, devfn); + + if ( !dev ) + return; msi_free_vectors(dev); + + /* Disable MSI and/or MSI-X */ + msi_set_enable(dev, 0); + msix_set_enable(dev, 0); } diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index ed4d2edaad..7791c46110 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1434,6 +1434,7 @@ void return_devices_to_dom0(struct domain *d) while ( !list_empty(&hd->pdev_list) ) { pdev = list_entry(hd->pdev_list.next, typeof(*pdev), list); + pci_cleanup_msi(pdev->bus, pdev->devfn); reassign_device_ownership(d, dom0, pdev->bus, pdev->devfn); } diff --git a/xen/include/asm-x86/msi.h b/xen/include/asm-x86/msi.h index 9cd34de8f9..757bdfc135 100644 --- a/xen/include/asm-x86/msi.h +++ b/xen/include/asm-x86/msi.h @@ -68,6 +68,7 @@ extern void write_msi_msg(unsigned int irq, struct msi_msg *msg); extern void set_msi_irq_affinity(unsigned int irq, cpumask_t mask); extern int pci_enable_msi(u8 bus, u8 devfn, int vector, int entry_nr, int msi); extern void pci_disable_msi(int vector); +extern void pci_cleanup_msi(u8 bus, u8 devfn); struct msi_desc { struct { -- 2.30.2